#ifndef HTTPMGR_H
#define HTTPMGR_H

/******************************************************************************
 *
 * @file       HttpMgr.cpp
 * @brief      http管理类主要用来管理http发送接收等请求
 *
 * @author     ax
 * @date       2024/05/10
 * @history
 *****************************************************************************/

#include "singleton.h"
#include "global.h"

#include <QObject>
#include <QString>
#include <QUrl>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <memory>
#include <QJsonObject>
#include <QJsonDocument>

// CRTP
// public std::enable_shared_from_this<HttpMgr> 得在后面继承的哦，应该是得在 public OBject 继承之后
class HttpMgr: public QObject, public Singleton<HttpMgr>, public std::enable_shared_from_this<HttpMgr>{
    Q_OBJECT

public:
    // Singleton.h 文件中的 static std::shared_ptr<K> _instance 会调用下面的这个析构函数
    ~HttpMgr();
    void PostHttpReq(QUrl url, QJsonObject json, ReqId req_id, Modules mod);

private:
    friend class Singleton<HttpMgr>;
    HttpMgr();
    QNetworkAccessManager _manager;

signals:
    void sig_http_finish(ReqId id, QString res, ErrorCodes err, Modules mod);  // HttpMgr单例类发送http请求server完成后触发的槽函数
    void sig_reg_mod_finish(ReqId id, QString res, ErrorCodes err);     // 触发RegisterDialog界面，注册的http请求完成槽函数
    void sig_reset_mod_finish(ReqId id, QString res, ErrorCodes err);   // 触发ResetDialog界面，注册的http请求完成槽函数
    void sig_login_mod_finish(ReqId id, QString res, ErrorCodes err);   // 触发LoginDialog界面，注册的http请求完成槽函数

private slots:
    void slot_http_finish(ReqId id, QString res, ErrorCodes err, Modules mod);
};

#endif // HTTPMGR_H
